# -*- coding: utf-8 -*-

# Import Python libs
from __future__ import absolute_import

# Import Salt Libs
from salt.modules import win_dism as dism

# Import Salt Testing Libs
from salttesting import TestCase
from salttesting.helpers import ensure_in_syspath
from salttesting.mock import (
    MagicMock,
    patch
)

ensure_in_syspath('../../')

dism.__salt__ = {}
dism.__grains__ = {}


class WinDismTestCase(TestCase):

    def test_add_capability(self):
        '''
            Test installing a capability with DISM
        '''
        mock = MagicMock()
        with patch.dict(dism.__salt__, {'cmd.run_all': mock}):
            with patch.dict(dism.__grains__, {'osversion': 10}):
                dism.add_capability("test")
                mock.assert_called_once_with(
                    ['DISM', '/Quiet', '/Online', '/Add-Capability',
                     '/CapabilityName:test', '/NoRestart'])

    def test_add_capability_with_extras(self):
        '''
            Test installing a capability with DISM
        '''
        mock = MagicMock()
        with patch.dict(dism.__salt__, {'cmd.run_all': mock}):
            with patch.dict(dism.__grains__, {'osversion': 10}):
                dism.add_capability("test", "life", True)
                mock.assert_called_once_with(
                    ['DISM', '/Quiet', '/Online', '/Add-Capability',
                     '/CapabilityName:test', '/Source:life', '/LimitAccess',
                     '/NoRestart'])

    def test_remove_capability(self):
        '''
            Test uninstalling a capability with DISM
        '''
        mock = MagicMock()
        with patch.dict(dism.__salt__, {'cmd.run_all': mock}):
            with patch.dict(dism.__grains__, {'osversion': 10}):
                dism.remove_capability("test")
                mock.assert_called_once_with(
                    ['DISM', '/Quiet', '/Online', '/Remove-Capability',
                     '/CapabilityName:test', '/NoRestart'])

    def test_get_capabilities(self):
        '''
            Test getting all the capabilities
        '''
        capabilties = "Capability Identity : Capa1\r\n State : Installed\r\n" \
                      "Capability Identity : Capa2\r\n State : Disabled\r\n"

        mock = MagicMock(return_value=capabilties)
        with patch.dict(dism.__salt__, {'cmd.run': mock}):
            with patch.dict(dism.__grains__, {'osversion': 10}):
                out = dism.get_capabilities()
                mock.assert_called_once_with(
                    ['DISM', '/Online', '/Get-Capabilities'])
                self.assertEqual(out, ['Capa1', 'Capa2'])

    def test_installed_capabilities(self):
        '''
            Test getting all the installed capabilities
        '''
        capabilties = "Capability Identity : Capa1\r\n State : Installed\r\n" \
                      "Capability Identity : Capa2\r\n State : Disabled\r\n"

        mock = MagicMock(return_value=capabilties)
        with patch.dict(dism.__salt__, {'cmd.run': mock}):
            with patch.dict(dism.__grains__, {'osversion': 10}):
                out = dism.installed_capabilities()
                mock.assert_called_once_with(
                    ['DISM', '/Online', '/Get-Capabilities'])
                self.assertEqual(out, ["Capa1"])

    def test_available_capabilities(self):
        '''
            Test getting all the available capabilities
        '''
        capabilties = "Capability Identity : Capa1\r\n State : Installed\r\n" \
                      "Capability Identity : Capa2\r\n State : Not Present\r\n"

        mock = MagicMock(return_value=capabilties)
        with patch.dict(dism.__salt__, {'cmd.run': mock}):
            with patch.dict(dism.__grains__, {'osversion': 10}):
                out = dism.available_capabilities()
                mock.assert_called_once_with(
                    ['DISM', '/Online', '/Get-Capabilities'])
                self.assertEqual(out, ["Capa2"])

    def test_add_feature(self):
        '''
            Test installing a feature with DISM
        '''
        mock = MagicMock()
        with patch.dict(dism.__salt__, {'cmd.run_all': mock}):
            dism.add_feature("test")
            mock.assert_called_once_with(
                ['DISM', '/Quiet', '/Online', '/Enable-Feature',
                 '/FeatureName:test', '/NoRestart'])

    def test_add_feature_with_extras(self):
        '''
            Test installing a feature with DISM
        '''
        mock = MagicMock()
        with patch.dict(dism.__salt__, {'cmd.run_all': mock}):
            dism.add_feature('sponge', 'bob', 'C:\\temp', True, True)
            mock.assert_called_once_with(
                ['DISM', '/Quiet', '/Online', '/Enable-Feature',
                 '/FeatureName:sponge', '/PackageName:bob', '/Source:C:\\temp',
                 '/LimitAccess', '/All', '/NoRestart'])

    def test_remove_feature(self):
        '''
            Test uninstalling a capability with DISM
        '''
        mock = MagicMock()
        with patch.dict(dism.__salt__, {'cmd.run_all': mock}):
            dism.remove_feature("test")
            mock.assert_called_once_with(
                ['DISM', '/Quiet', '/Online', '/Disable-Feature',
                 '/FeatureName:test', '/NoRestart'])

    def test_remove_feature_with_extras(self):
        '''
            Test uninstalling a capability with DISM
        '''
        mock = MagicMock()
        with patch.dict(dism.__salt__, {'cmd.run_all': mock}):
            dism.remove_feature('sponge', True)
            mock.assert_called_once_with(
                ['DISM', '/Quiet', '/Online', '/Disable-Feature',
                 '/FeatureName:sponge', '/Remove', '/NoRestart'])

    def test_get_features(self):
        '''
            Test getting all the features
        '''
        features = "Feature Name : Capa1\r\n State : Enabled\r\n" \
                      "Feature Name : Capa2\r\n State : Disabled\r\n"

        mock = MagicMock(return_value=features)
        with patch.dict(dism.__salt__, {'cmd.run': mock}):
            out = dism.get_features()
            mock.assert_called_once_with(['DISM', '/Online', '/Get-Features'])
            self.assertEqual(out, ['Capa1', 'Capa2'])

    def test_installed_features(self):
        '''
            Test getting all the installed features
        '''
        features = "Feature Name : Capa1\r\n State : Enabled\r\n" \
                      "Feature Name : Capa2\r\n State : Disabled\r\n"

        mock = MagicMock(return_value=features)
        with patch.dict(dism.__salt__, {'cmd.run': mock}):
            out = dism.installed_features()
            mock.assert_called_once_with(['DISM', '/Online', '/Get-Features'])
            self.assertEqual(out, ["Capa1"])

    def test_available_features(self):
        '''
            Test getting all the available features
        '''
        features = "Feature Name : Capa1\r\n State : Enabled\r\n" \
                   "Feature Name : Capa2\r\n State : Disabled\r\n"

        mock = MagicMock(return_value=features)
        with patch.dict(dism.__salt__, {'cmd.run': mock}):
            out = dism.available_features()
            mock.assert_called_once_with(['DISM', '/Online', '/Get-Features'])
            self.assertEqual(out, ["Capa2"])

    def test_add_package(self):
        '''
            Test installing a package with DISM
        '''
        mock = MagicMock()
        with patch.dict(dism.__salt__, {'cmd.run_all': mock}):
            dism.add_package("test")
            mock.assert_called_once_with(
                ['DISM', '/Quiet', '/Online', '/Add-Package',
                 '/PackagePath:test', '/NoRestart'])

    def test_add_package_with_extras(self):
        '''
            Test installing a package with DISM
        '''
        mock = MagicMock()
        with patch.dict(dism.__salt__, {'cmd.run_all': mock}):
            dism.add_package('sponge', True, True)
            mock.assert_called_once_with(
                ['DISM', '/Quiet', '/Online', '/Add-Package',
                 '/PackagePath:sponge', '/IgnoreCheck', '/PreventPending',
                 '/NoRestart'])

    def test_remove_package(self):
        '''
            Test uninstalling a package with DISM
        '''
        mock = MagicMock()
        with patch.dict(dism.__salt__, {'cmd.run_all': mock}):
            dism.remove_package("test")
            mock.assert_called_once_with(
                ['DISM', '/Quiet', '/Online', '/Remove-Package', '/NoRestart',
                 '/PackagePath:test'])

    def test_installed_packages(self):
        '''
            Test getting all the installed features
        '''
        features = "Package Identity : Capa1\r\n State : Installed\r\n" \
                   "Package Identity : Capa2\r\n State : Installed\r\n"

        mock = MagicMock(return_value=features)
        with patch.dict(dism.__salt__, {'cmd.run': mock}):
            out = dism.installed_packages()
            mock.assert_called_once_with(['DISM', '/Online', '/Get-Packages'])
            self.assertEqual(out, ['Capa1', 'Capa2'])

if __name__ == '__main__':
    from integration import run_tests
    run_tests(WinDismTestCase, needs_daemon=False)
